using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Boa.AIT.AccesoDatos.Entidades;
using Boa.AIT.AccesoDatos.Contratos;
using Boa.AIT.Negocios.Servicios;
using Boa.AIT.Negocios.Excepciones;

namespace Boa.AIT.Negocios
{
   /// <summary>
   /// Implementacion de la interface IAIT_EquipoITNegociosServicio, los metodos que estan definidos en el contrato IAIT_EquipoITNegociosServicio serán accesibles desde un contexto externo
   /// </summary>	
   public class AIT_EquipoITNegocios : IAIT_EquipoITNegociosServicio
   {
	private IAIT_EquipoITAccesoDatos accesoDatos;
	public AIT_EquipoITNegocios()
	{		
		accesoDatos = DataFactory.Current.GetAIT_EquipoITAccesoDatos();
	}
	
	/// <summary>
    /// Devuelve una lista de AIT_EquipoIT's de las ocurrencias encontradas a partir del filtro
    /// </summary>    
	public List<AIT_EquipoIT> BuscarPorFiltro(string filtro)
	{
		return accesoDatos.BuscarPorFiltro(filtro).ToList();
	}

	#region operaciones básicas
	
	/// <summary>
    /// Elimina la entidad AIT_EquipoIT, lanzará una excepcion si la entidad guarda dependencia a otras entidades
    /// </summary>	
	public void Eliminar(AIT_EquipoIT entidad)
	{
		try
		{
		    accesoDatos.Delete(accesoDatos.GetById(entidad.Id));
	    }
		catch(Exception ex)
		{
		   throw new AIT_EquipoITEliminarExcepcion("AIT_EquipoIT");
		}
	}
	
	/// <summary>
    /// Devuelve AIT_EquipoIT, buscada por su Id, si no existe, entonces devuelve null
    /// </summary>	
	public AIT_EquipoIT ObtenerPorId(object Id)
	{
		return accesoDatos.GetById(Id);
	}

	/// <summary>
    /// Devuelve List<AIT_EquipoIT>, de todas la entidades de ese tipo
    /// </summary>	
	public List<AIT_EquipoIT> ObtenerTodas()
	{
		return accesoDatos.GetAll().ToList();
	}

	
	/// <summary>
    /// Guarda AIT_EquipoIT, previa ejecucion satisfactoria de las reglas de negocio
    /// </summary>	
	public AIT_EquipoIT Guardar(AIT_EquipoIT entidad)
	{
		//Agregar aqui las reglas de negocio.......	
		if(entidad==null)
		 throw new AIT_EquipoITRequeridoExcepcion(); 
		
		#region Foreign Keys Values
                if(entidad.ModeloEquipoId_FK > 0 && entidad.ModeloEquipo==null)
                    entidad.ModeloEquipo = DataFactory.Current.GetAIT_ModeloEquipoAccesoDatos().GetById(entidad.ModeloEquipoId_FK);               
                if(entidad.EquipoCompuestoId_FK > 0 && entidad.EquipoCompuesto==null)
                    entidad.EquipoCompuesto = DataFactory.Current.GetAIT_EquipoCompuestoAccesoDatos().GetById(entidad.EquipoCompuestoId_FK);
                if (entidad.ProveedorId_FK > 0 && entidad.Proveedor == null)
                    entidad.Proveedor = DataFactory.Current.GetAIT_ProveedorAccesoDatos().GetById(entidad.ProveedorId_FK);
        #endregion


        if (string.IsNullOrEmpty(entidad.Guid))
            entidad.Guid = System.Guid.NewGuid().ToString();

        if (string.IsNullOrEmpty(entidad.Codigo))
        {
            var ultimo = accesoDatos.GetAll().Where(p => p.EsAccesorio.Equals(entidad.EsAccesorio)).OrderByDescending(p => p.Id).FirstOrDefault();
            //asignar codigo
            entidad.Codigo = entidad.ModeloEquipo.TipoEquipo.Codigo + "-" + entidad.ModeloEquipo.Codigo + "-" + (ultimo != null ? ultimo.Id.ToString() : "0001").PadLeft(4, '0');  
        }


        if (entidad.Id == 0)
        {

                    
            accesoDatos.Insert(entidad);
        }
        else
        {
            accesoDatos.Update(entidad);
        }

		return entidad;
	}

	#endregion

    public List<AIT_EquipoIT> GetEquiposNoAsignados()
    {

        return accesoDatos.GetEquiposNoAsignados().ToList<AIT_EquipoIT>();

    }


    public List<AIT_EquipoIT> ListarEquiposDelLote(int LoteId)
    {
        return accesoDatos.GetEquiposDeLote(LoteId).ToList();
    }


    public List<AIT_EquipoIT> ListarAccesorios()
    {
        return accesoDatos.GetAll().Where(p => p.EsAccesorio).ToList();
    }

    public List<AIT_EquipoIT> ListarEquipos()
    {
        return accesoDatos.GetAll().Where(p => !p.EsAccesorio).ToList();
    }

    public List<AIT_EquipoIT> ListarEquiposNoAsignados()
    {
        return accesoDatos.GetEquiposLibres().ToList();
        //return accesoDatos.GetAll().Where(p => !p.EsAccesorio).ToList();
    }

    public List<AIT_EquipoIT> ListarAccesoriosNoAsignados()
    {
        //return accesoDatos.GetAll().Where(p => p.EsAccesorio).ToList();
        return accesoDatos.GetAccesoriosLibres().ToList();
    }



    public AIT_EquipoIT ObtenerPorGuid(string guid)
    {
        return accesoDatos.GetAll().Where(p => p.Guid.Equals(guid)).FirstOrDefault();
    }
   }
}


